<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // ES5对象可控变量属性定义语法(数据劫持)
        let user = {
            age: 23
        };
        // user.name="alice";
        // user["name"]="cici";
        /*  Object.defineProperty(target,attrname,config)
         target:操作的目标对象
         attrname:被操作的属性名
         config:属性特性配置(可写，可循环，可删除....)
         */
        Object.defineProperty(user, "name", {
            value: "tom",//设置name的属性值，value属性不能get、set同时出现
            enumerable: true
        });
        console.log(user);
        for(let key in user){
            console.log(user[key]);
        }

        let stu = {
            //js中，程序员直接约定_开头的变量为私有变量，不建议外部调用
            _name:"cici"
        };
      
        Object.defineProperty(stu,"name", {
           get(){//控制name的取值操作，当通过stu.name属性时候，必须由该方法返回结果
                console.log(this);
                return this._name;
           },
           set(val){//控制name的赋值操作，当通过stu.name属性赋值操作时候，必须由该方法完成变量值修改
                console.log("name的新值:",val);
                // stu._name=val;
                this._name= val;
           }
        });
        // stu.name="hello";
        console.log(stu);
        console.log(stu.name);
    </script>
</body>

</html>